# -*- coding: utf-8 -*-
'''
Created on 2014-1-6

@author: zengyixun
'''

import types 
class NotIntegerError(Exception): 
    pass 
class OutOfRangeError(Exception): 
    pass 
_MAPPING = (u'零', u'一', u'二', u'三', u'四', u'五', u'六', u'七', u'八', u'九', ) 
_P0 = (u'', u'十', u'百', u'千', ) 
_S4, _S8, _S16 = 10 ** 4 , 10 ** 8, 10 ** 16 
_MIN, _MAX = 0, 9999999999999999 
def _to_chinese4(num): 
    '''''转换[0, 10000)之间的阿拉伯数字 
    ''' 
    assert(0 <= num and num < _S4) 
    if num < 10: 
        return _MAPPING[num] 
    lst = []
    while num >= 10: 
        lst.append(num % 10) 
        num = num / 10 
    lst.append(num) 
    c = len(lst) # 位数 
    print lst
    result = u'' 
    for idx, val in enumerate(lst): 
        if val != 0: 
            print _P0
            print _MAPPING
            print idx
            print val
            result += _P0[idx] + _MAPPING[val] 
            if idx < c - 1 and lst[idx + 1] == 0: 
                result += u'零' 
    return result[::-1].replace(u'一十', u'十') 

def _to_chinese8(num): 
    assert(num < _S8) 
    to4 = _to_chinese4 
    if num < _S4: 
        return to4(num) 
    else: 
        mod = _S4 
        high, low = num / mod, num % mod 
        if low == 0: 
            return to4(high) + u'万' 
        else: 
            if low < _S4 / 10: 
                return to4(high) + u'万零' + to4(low) 
            else: 
                return to4(high) + u'万' + to4(low) 

def _to_chinese16(num): 
    assert(num < _S16) 
    to8 = _to_chinese8 
    mod = _S8 
    high, low = num / mod, num % mod 
    if low == 0: 
        return to8(high) + u'亿' 
    else: 
        if low < _S8 / 10: 
            return to8(high) + u'亿零' + to8(low) 
        else: 
            return to8(high) + u'亿' + to8(low) 
def N2C(num): 
    if type(num) != types.IntType and type(num) != types.LongType: 
        raise NotIntegerError(u'%s is not a integer.' % num) 
    if num < _MIN or num > _MAX: 
        raise OutOfRangeError(u'%d out of range[%d, %d)' % (num, _MIN, _MAX)) 
    if num < _S4: 
        return _to_chinese4(num) 
    elif num < _S8: 
        return _to_chinese8(num) 
    else: 
        return _to_chinese16(num) 


_dict_ch ={u'零':0, u'一':1, u'二':2, u'三':3, u'四':4, u'五':5, u'六':6, u'七':7, u'八':8, u'九':9, u'十':10, u'百':100, u'千':1000, u'万':10000,
       u'０':0, u'１':1, u'２':2, u'３':3, u'４':4, u'５':5, u'６':6, u'７':7, u'８':8, u'９':9,
                u'壹':1, u'贰':2, u'叁':3, u'肆':4, u'伍':5, u'陆':6, u'柒':7, u'捌':8, u'玖':9, u'拾':10, u'佰':100, u'仟':1000, u'萬':10000,
       u'亿':100000000}

def C2N(a, encoding="utf-8"):
    if isinstance(a, str):
        a = a.decode(encoding)

    count = 0 
    result = 0
    tmp = 0
    Billion = 0  
    while count < len(a):
        tmpChr = a[count]
        #print tmpChr
        tmpNum = _dict_ch.get(tmpChr, None)
        #如果等于1亿
        if tmpNum == 100000000:
            result = result + tmp
            result = result * tmpNum
            #获得亿以上的数量，将其保存在中间变量Billion中并清空result
            Billion = Billion * 100000000 + result 
            result = 0
            tmp = 0
        #如果等于1万
        elif tmpNum == 10000:
            result = result + tmp
            result = result * tmpNum
            tmp = 0
        #如果等于十或者百，千
        elif tmpNum >= 10:
            if tmp == 0:
                tmp = 1
            result = result + tmpNum * tmp
            tmp = 0
        #如果是个位数
        elif tmpNum is not None:
            tmp = tmp * 10 + tmpNum
        count += 1
    result = result + tmp
    result = result + Billion
    return result

if __name__ == '__main__': 
    print N2C(190099000) 

